﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Text;
using System.Xml;
using System.IO;

using System.Configuration;

namespace CasasJusticia.Messaging
{
    public class ConectarBaseDatos
    {
        #region Miembros de Datos

        private string _usuario = string.Empty;

        private string _contraseña = string.Empty;

        private string _nombreBaseDatos = string.Empty;

        private string _nombreServidor = string.Empty;

        private SqlConnectionStringBuilder _cadenaConexion;

        private SqlConnection _conexion;

        #endregion

        #region Propiedades

        public SqlConnectionStringBuilder CadenaConexion
        {
            get
            {
                return this._cadenaConexion;
            }
            private set
            {
                if (this._cadenaConexion != value)
                    this._cadenaConexion = value;
            }
        }

        public SqlConnection Conexion
        {
            get
            {
                return this._conexion;
            }
            private set
            {
                if (this._conexion != value)
                    this._conexion = value;
            }
        }

        public string NombreBaseDatos
        {
            get
            {
                return this._nombreBaseDatos;
            }
            set
            {
                if (!this._nombreBaseDatos.Equals(value))
                {
                    this._nombreBaseDatos = value;
                }
            }
        }

        public string NombreServidor
        {
            get
            {
                return this._nombreServidor;
            }
            set
            {
                if (!this._nombreServidor.Equals(value))
                {
                    this._nombreServidor = value;
                }
            }
        }

        public string Usuario
        {
            get
            {
                return this._usuario;
            }
            set
            {
                if (!this._usuario.Equals(value))
                {
                    this._usuario = value;
                }
            }
        }

        public string Contraseña
        {
            get
            {
                return this._contraseña;
            }
            set
            {
                if (!this._contraseña.Equals(value))
                {
                    this._contraseña = value;
                }
            }
        }

        #endregion

        #region Constructor

        /// <summary>
        /// 
        /// </summary>
        public ConectarBaseDatos()
        {
            this.LeerParametrosConexion();
        }

        #endregion

        #region Procedimientos y Funciones

        /// <summary>
        /// 
        /// </summary>
        public void CerrarConexion()
        {
            if (this.Conexion == null)
                this.Conexion = new SqlConnection();
            else if (this.Conexion.State == System.Data.ConnectionState.Open)
            {
                this.Conexion.Close();
            }
        }

        /*/// <summary>
        /// 
        /// </summary>
        private void CrearCadenaConexion()
        {
            if (string.IsNullOrEmpty(this.Usuario) || string.IsNullOrEmpty(this.Contraseña) || string.IsNullOrEmpty(this.NombreServidor) || string.IsNullOrEmpty(this.NombreBaseDatos))
                return;

            this.CadenaConexion = new SqlConnectionStringBuilder();
            this.CadenaConexion.UserID = this.Usuario;
            this.CadenaConexion.Password = this.Contraseña;
            this.CadenaConexion.InitialCatalog = this.NombreBaseDatos;
            this.CadenaConexion.DataSource = this.NombreServidor;
        }*/

        /// <summary>
        /// 
        /// </summary>
        public void Iniciar()
        {
            try
            {   
                if (this.CadenaConexion == null)
                {
                    throw new Exception("Los parámetros de conexión no están completos");
                }
                this.CerrarConexion();
                this.Conexion.ConnectionString = this.CadenaConexion.ConnectionString;
                this.Conexion.Open();
            }
            catch(SqlException e)
            {
                throw new Exception(string.Format("Error al conectar con la Base de Datos: {0}", e.Message));
            }
        }

        /// <summary>
        /// 
        /// </summary>
        private void LeerParametrosConexion()
        {
            try
            {
                /*string rutaXml = "Configuracion\\BaseDatos.xml";
                string rutaArchivoConfiguracion = Path.Combine(this.ObtenerRutaEnsamblado(), rutaXml);
                XmlDocument parametros = new XmlDocument();
                parametros.Load(rutaArchivoConfiguracion);
                this.NombreBaseDatos = this.ObtenerValorEtiqueta(ref parametros, "database");
                this.Usuario = this.ObtenerValorEtiqueta(ref parametros, "username");
                this.Contraseña = this.ObtenerValorEtiqueta(ref parametros, "password");                
                this.NombreServidor = this.ObtenerValorEtiqueta(ref parametros, "server");*/
                this.CadenaConexion = new SqlConnectionStringBuilder();
                this.CadenaConexion.ConnectionString = ConfigurationManager.ConnectionStrings["SdeFinal"].ConnectionString;
                this.Usuario = this.CadenaConexion.UserID;
                this.Contraseña = this.CadenaConexion.Password;
                this.NombreServidor = this.CadenaConexion.DataSource;
                this.NombreBaseDatos = this.CadenaConexion.InitialCatalog;
                
            }catch(Exception e)
            {
                throw new Exception(string.Format("Error al leer parámetros en el archivo xml: {0}", e.Message));
            }
        }

        /// <summary>
        /// Obtiene el valor de una etiqueta en un archivo xml dado su nombre
        /// </summary>
        /*private String ObtenerValorEtiqueta(ref XmlDocument xml, string nombreEtiqueta)
        {            
            try
            {
                if (xml.GetElementsByTagName(nombreEtiqueta).Item(0).HasChildNodes)
                {
                    return xml.GetElementsByTagName(nombreEtiqueta).Item(0).ChildNodes.Item(0).Value.ToString();
                }
                else
                {
                    return xml.GetElementsByTagName(nombreEtiqueta).Item(0).Attributes.Item(0).Value.ToString();
                }

            }
            catch(Exception e)
            {
                return null;
            }
        }*/
        

        /*private string ObtenerRutaEnsamblado()
        {
            string rutaEnsamblado = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
            rutaEnsamblado = rutaEnsamblado.Replace("file:\\", "");
            rutaEnsamblado = String.Format("{0}\\", rutaEnsamblado);
            return rutaEnsamblado;
        }*/

        #endregion

    }
}
